#include <fstream>
#include <string>
#include "ari.h"

using namespace std;

class MIPS;

/***********************************************
TEMPS...
***********************************************/
string bancoTemporarios(int posicao);

/***********************************************
MUNCHS...
***********************************************/
string munchBinop(BinOp* binOp);
string munchBinopLValue(BinOp* binOp);
string munchCall(Call* call);
string munchConst(Const* _const);
void munchCJump(CJump* j);
string munchExp(ExpARI* exp);
void munchJump(Jump* jump);
void munchLabel(Label* label);
string munchMem(Mem* mem);
string munchMemLvalue(Mem* mem);
string munchMove(Mem* dst, ExpARI* src);
string munchMove(Name* dst, ExpARI* src);
string munchMove(ExpARI* dst, ExpARI* src);
string munchMove(Temp* dst, ExpARI* src);
string munchName(Name* name);
void munchStm(Stm* s);
string munchTemp(Temp* temp);

/***********************************************
CLASSE PARA GERACAO DE CODIGO...
***********************************************/
class MIPS {
  public:
	string mipsStr;
	MIPS* proximo;
	MIPS(string mipsStr, MIPS* proximo);
	~MIPS();
};

/***********************************************
VISITOR PARA GERACAO DE CODIGO...
***********************************************/
class VisitorGeradorMIPS {
    public:
        /*string nomeProc;
        int framesize;
        int offset;
        int maior;
        int menor;
        bool global;
        int principal;
        int teste;*/

        //void geraArquivo(char *nomeArquivo);
        //VisitorGerador();

        void visit(FragmentList* fragmentList);
        void visit(Procedure* procedure);
        void visit(LiteralARI* literalARI);
        void visit(FrameMips* frameMips);
        void visit(Temp* temp);
        void visit(Label* label);
        void visit(ListaAcesso* listaAcesso);
        void visit(InFrame* inFrame);
        void visit(InReg* inReg);
        void visit(ExpARIList* expList);
        void visit(Const* _const);
        void visit(ConstF* constF);
        void visit(Name* name);
        void visit(BinOp* binOp);
        void visit(Mem* mem);
        void visit(CallARI* call);
        void visit(Eseq* eseq);
        void visit(Move* move);
        void visit(ExpARI* expARI);
        void visit(Jump* jump);
        void visit(CJump* cJump);
        void visit(Seq* seq);
        void visit(Global* global);
};


void MIPSArquivo(char* arquivo);
void imprimeCodigo(FragmentList* fragmentList);
void arquivoASM(char* arquivo);
